#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define N 128

int main(int argc, char const *argv[])
{
    //1. 生成一个IPC 唯一key值
    key_t key = ftok("/home",1);
    if (key < 0)
    {
        perror("key");
        exit(-1);
    }
    printf("key=%#x\n",key);
    int shmid = shmget(key,N,IPC_CREAT|0664);//如果不存在就创建，存在就打开
    if (shmid < 0)
    {
        perror("shmid");
        exit(-1);
    }
    printf("shmid=%d\n",shmid);
    system("ipcs -m");//执行linux系统的一个命令 查看系统的共享内存
    
    void *shmaddr = shmat(shmid,NULL,0);//把共享内存映射到进程内，进程就可以访问这段内存了
    if (shmaddr == (void *)-1)
    {
        perror("shmaddr");
        exit(-1);
    }
    system("ipcs -m");//执行linux系统的一个命令 查看系统的共享内存
    memset(shmaddr,'O',N);//对共享内存进行操作，写入128个O
    
    int ret = shmdt(shmaddr);
    if (ret < 0)
    {
        perror("ret");
        exit(-1);
    }
    system("ipcs -m");//执行linux系统的一个命令 查看系统的共享内存
    
    ret = shmctl(shmid,IPC_RMID,NULL);
    if (ret < 0)
    {
        perror("ret");
        exit(-1);
    }
     system("ipcs -m");//执行linux系统的一个命令 查看系统的共享内存

    return 0;
}
